import {Routers, simpleRouter, mainRouter, marketRouter, appRouter} from '@/router/router';
import Util from '@/libs/util';
import Tools from '@/libs/tools';
import Vue from 'vue';
import API from '@/api/index';

// 是否加载中
const loadings = {
	brand: false,
	category: false,
	deliveryTemplate: false
}

// 是否已加载
const isLoad = {
	areas: false,
	countries: false
}

// 格式化地区数据
const formatAreaData = function(data) {
	return data.map(item => {
		let obj = {
			title: item.name,
			label: item.name,
			value: item.id,
			parent_id: item.parent_id,
			zipcode: item.zipcode,
			level: item.level
		}
		if(item._children && item._children.length > 0) {
			obj.children = formatAreaData(item._children);
		}
		return obj;
	})
}

const app = {
    state: {
    	// 需要缓存的页面
    	cachePage: [],
    	// 菜单列表
    	menuList: [],
    	// 应用中心菜单列表
    	marketMenuList: [],
    	// 可用应用列表
    	marketLists: [],
    	// 地区数据
    	areas: [],
    	// 国家列表
    	countries: [],
    	// 商品分类数据，树形结构
    	reloadCategory: true,
    	categories: [],
    	// 商品品牌数据
    	reloadBrand: true,
    	brands: [],
    	deliveryTemplates: []
    },
    mutations: {
    	// 更新菜单，这里可以做权限判断，显示需要展示的菜单
        updateMenulist (state) {
            state.menuList = appRouter;
            state.marketMenuList = marketRouter.children;
            state.marketLists = marketRouter.children.map(item => {
            	return {
            		icon: item.meta.icon,
            		title: item.meta.title,
            		describe: item.meta.describe,
            		route: item.children[0].name
            	}
            })
        },
        // 获取需要缓存的路由，只针对登录后的页面
        initCachePage(state) {
        	let caches = [];
        	let rs = [...simpleRouter, mainRouter, ...appRouter];
        	
        	function getCacheRouteName(routes) {
        		for(let item in routes) {
        			if(routes[item].meta && routes[item].meta.cache) {
        				caches.push(routes[item].name);
        			}
        			if(routes[item].children && routes[item].children.length > 0) {
        				getCacheRouteName(routes[item].children);
        			}
        		}
        	}
        	getCacheRouteName(rs);
        	
        	state.cachePage = caches;
        },
        // 设置地区数据
        setAreaData(state, data) {
        	state.areas = data;
        },
        // 设置国家数据
        setCountryData(state, data) {
        	state.countries = data;
        },
        // 设置是否需要重新拉去分类数据
        setReloadCategory(state, status) {
        	state.reloadCategory = status;
        },
        setCategoryData(state, data) {
        	state.reloadCategory = false;
        	state.categories = data;
        },
        // 设置是否需要重新拉去品牌数据
        setReloadBrand(state, status) {
        	state.reloadBrand = status;
        },
        // 设置运费模板
        setDeliveryTemplates(state, data) {
        	state.deliveryTemplates = data;
        }
    },
    // 接受dispatch传递过来的方法和参数
    actions: {
    	// 获取地区数据
    	getAreaData(context) {
    		if(isLoad.areas) return false;
    		isLoad.areas = true;
    		Util.ajax.post(API['API_SETTING_AREAS'], {tree: true, level: 3}).then((res) => {
    			context.commit('setAreaData', formatAreaData(res));
    		}).catch(() => {
    			isLoad.areas = false;
    		})
    	},
    	// 获取国家列表
    	getCountryData(context) {
    		if(isLoad.countries) return false;
    		isLoad.countries = true;
    		Util.ajax.post(API['API_SETTING_COUNTRIES'], {}).then((res) => {
    			context.commit('setCountryData', res);
    		}).catch(() => {
    			isLoad.countries = false;
    		})
    	},
    	// 获取品牌数据，在对品牌进行增删改后，需要对reloadBrand设置为true，并在调用品牌数据的页面需再次调用getBrandData来检查是否更新数据
    	getBrandData(context) {
    		if(!context.state.reloadBrand || loadings.brand) return false;
    		loadings.brand = true;
    		Util.ajax.post(API['API_GOODS_BRAND_LISTS'], {limit: false, page: false, order: 0}).then((res) => {
    			loadings.brand = false;
    			context.state.brands = res;
    			context.commit('setReloadBrand', false);
    		}).catch(() => {
    			loadings.brand = false;
    		})
    	},
    	// 获取品类数据 ，在对品类进行增删改后，需要对reloadCategory设置为true，并在调用品类数据的页面需再次调用getCategoryData来检查是否更新数据
    	getCategoryData(context) {
    		if(!context.state.reloadCategory || loadings.category) return false;
    		loadings.category = true;
    		Util.ajax.post(API['API_GOODS_CATEGORY_LISTS'], {is_tree: 1, status: 1, sort: 0, limit: false, page: false, order: 0}).then((res) => {
    			loadings.category = false;
    			context.commit('setCategoryData', Tools.formatData(res));
    		}).catch(() => {
    			loadings.category = false;
    		})
    	},
    	// 获取运费模板
    	getDeliveryTemplates(context) {
    		if(isLoad.deliveryTemplate) return false;
    		isLoad.deliveryTemplate = true;
    		Util.ajax.post(API['API_SETTING_DELIVERY_TEMPLATES'], {}).then((res) => {
    			context.commit('setDeliveryTemplates', res.reverse());
    		}).catch(() => {
    			isLoad.deliveryTemplate = false;
    		})
    	}
    }
};

export default app;
